package com.btm.dorisinfo.controller;

import com.btm.dorisinfo.model.TableInfo;
import com.btm.dorisinfo.model.TableCommentUpdateRequest;
import com.btm.dorisinfo.service.TableStructureService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.btm.common.model.PageResult;

import java.util.List;
import java.util.Map;

/**
 * 表结构管理控制器
 * 提供表结构查询和更新的REST API接口
 * 支持数据库表结构和Meilisearch索引结构的管理
 *
 * @author btm
 * @since 2024-03-21
 */
@Slf4j
@RestController
@RequestMapping("/api/doris/table-structure")
@RequiredArgsConstructor
public class TableStructureController {

    /**
     * 表结构服务
     * 用于处理表结构的查询和更新操作
     */
    private final TableStructureService tableStructureService;

    /**
     * 获取数据库表结构
     * 根据数据库名和表名查询表的完整结构信息
     *
     * @param tableSchema 数据库名
     * @param tableName 表名
     * @return 表结构信息，包含表的基本信息和列信息
     */
    @GetMapping("/database/{tableSchema}/{tableName}")
    public TableInfo getDatabaseTableStructure(
            @PathVariable String tableSchema,
            @PathVariable String tableName) {
        return tableStructureService.getDatabaseTableStructure(tableSchema, tableName);
    }

    /**
     * 获取Meilisearch索引结构（分页）
     * @param tableName Meilisearch索引名称
     * @param page 页码
     * @param size 每页数量
     * @return 分页结果
     */
    @GetMapping("/meilisearch/{tableName}")
    public PageResult<TableInfo> getMeilisearchTableStructure(
            @PathVariable String tableName,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        return tableStructureService.getMeilisearchTableStructures(tableName, page, size);
    }

    /**
     * 更新数据库表注释
     * 更新指定表中各字段的注释信息
     *
     * @param tableStructure 包含更新后注释信息的表结构
     */
    @PutMapping("/database/comment")
    public void updateDatabaseComment(@RequestBody TableInfo tableStructure) {
        tableStructureService.updateDatabaseComment(tableStructure);
    }

    /**
     * 更新Meilisearch索引结构
     * 更新Meilisearch中指定索引的结构信息
     *
     * @param tableStructure 包含更新后结构信息的表结构
     */
    @PutMapping("/meilisearch/structure")
    public void updateMeilisearchStructure(@RequestBody TableInfo tableStructure) {
        tableStructureService.updateMeilisearchStructure(tableStructure);
    }

    /**
     * 更新数据库表备注
     * 更新指定表的表备注信息
     *
     * @param request 包含表信息和新备注的请求
     * @return 更新结果
     */
    @PutMapping("/database/table-comment")
    public ResponseEntity<String> updateDatabaseTableComment(@RequestBody TableCommentUpdateRequest request) {
        try {
            if (request.getTableSchema() == null || request.getTableName() == null || request.getTableComment() == null) {
                return ResponseEntity.badRequest().body("参数不完整，请检查数据库名、表名和表备注是否都已提供");
            }
            tableStructureService.updateDatabaseTableComment(
                request.getTableSchema(),
                request.getTableName(),
                request.getTableComment()
            );
            return ResponseEntity.ok("数据库表备注更新成功");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("更新数据库表备注失败: " + e.getMessage());
        }
    }

    /**
     * 更新Meilisearch中的表备注
     * 更新Meilisearch中指定表的表备注信息
     *
     * @param request 包含表ID和新备注的请求
     * @return 更新结果
     */
    @PutMapping("/meilisearch/table-comment")
    public ResponseEntity<String> updateMeilisearchTableComment(@RequestBody TableCommentUpdateRequest request) {
        try {
            if (request.getId() == null || request.getTableComment() == null) {
                return ResponseEntity.badRequest().body("参数不完整，请检查表ID和表备注是否都已提供");
            }
            tableStructureService.updateMeilisearchTableComment(
                request.getId(),
                request.getTableComment()
            );
            return ResponseEntity.ok("Meilisearch表备注更新成功");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("更新Meilisearch表备注失败: " + e.getMessage());
        }
    }

    /**
     * 删除Meilisearch中的表结构
     * @param id 表结构唯一标识
     * @return 删除结果
     */
    @DeleteMapping("/meilisearch/{id}")
    public ResponseEntity<String> deleteMeilisearchTable(@PathVariable long id) {
        try {
            tableStructureService.deleteMeilisearchTable(id);
            return ResponseEntity.ok("删除成功");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("删除失败: " + e.getMessage());
        }
    }

    /**
     * 初始化：将数据库表结构写入Meilisearch索引
     * @param params 包含tableSchema和tableName
     * @return 初始化结果
     */
    @PostMapping("/init")
    public ResponseEntity<?> initTableToMeilisearch(@RequestBody Map<String, String> params) {
        String tableSchema = params.get("tableSchema");
        String tableName = params.get("tableName");
        if (tableSchema == null || tableSchema.isEmpty() || tableName == null || tableName.isEmpty()) {
            return ResponseEntity.badRequest().body(Map.of("success", false, "message", "参数不完整"));
        }
        try {
            boolean ok = tableStructureService.initTableToMeilisearch(tableSchema, tableName);
            if (ok) {
                return ResponseEntity.ok(Map.of("success", true, "message", "初始化成功"));
            } else {
                return ResponseEntity.ok(Map.of("success", false, "message", "初始化结果不确定：请过段时间查询后再试"));
            }
        } catch (Exception e) {
            log.error("初始化失败: ", e);
            return ResponseEntity.internalServerError().body(Map.of("success", false, "message", "初始化失败: " ));
        }
    }
} 